package CurrencyConverter

import (
	"encoding/json"
	"errors"
	"fmt"
	"io/ioutil"
	"net/http"
	"strings"
)

// здесь создается структура парсинга из json в строку и тд
type CurrencyData struct {
	Valute map[string]struct {
		CharCode string  `json:"CharCode"`
		Value    float64 `json:"Value"`
	} `json:"Valute"`
}

// здесь задаем урл откуда берем данные, в нашем случае это цб рф
const url = "https://www.cbr-xml-daily.ru/daily_json.js"

// здесь настройка получения данных с url
func getCurrencyRates() (map[string]float64, error) {
	// создается запрос на получение данных с урла
	resp, err := http.Get(url)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	// чтение данных
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return nil, err
	}
	// парсинг json
	var data CurrencyData
	err = json.Unmarshal(body, &data)
	if err != nil {
		return nil, err
	}
	// создание map
	rates := make(map[string]float64)
	// здесь код вывода всех доступных валют
	for key, valute := range data.Valute {
		rates[valute.CharCode] = valute.Value
		fmt.Printf("Валюта %s: %f\n", key, valute.Value)
	}

	return rates, nil
}

// здесь код конвертации валют, choose1 - первая валюта, choose2 - вторая, amount - количество
func Convert(choose1, choose2 string, amount float64) (float64, error) {
	rates, err := getCurrencyRates()
	if err != nil {
		fmt.Println("Ошибка получения курса валют:", err)
	}

	// запрашиваем первую валюту
	fmt.Println("Выберите валюту для первого значения")
	fmt.Scanln(&choose1)
	// в случае если человек пишет маленьким регистром, то преобразуем к верхнему регистру
	choose1 = strings.ToUpper(choose1)
	_, exists1 := rates[choose1]
	// проверка на существование валюты
	if !exists1 {
		return 0, errors.New("Такой валюты не существует или выбрана неверная валюта")
	}
	// запрашиваем вторую валюту
	fmt.Println("Выберите валюту для второго значения")
	fmt.Scanln(&choose2)
	choose2 = strings.ToUpper(choose2)

	_, exists2 := rates[choose2]
	if !exists2 {
		return 0, errors.New("Такой валюты не существует или выбрана неверная валюта")
	}
	if rates[choose2] == rates[choose1] {
		return 0, errors.New("Вы ввели одинаковые валюты")
	}
	// здесь запрашиваем количество первой валюты для сравнения со второй
	fmt.Println("Выберите количество", rates[choose1])
	fmt.Scanln(&amount)
	// ну а здесь формула вычисления
	result := amount * rates[choose1] / rates[choose2]

	return result, nil
}
